<!DOCTYPE html>
<html lang="zh-CH" >
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="" />
	
	
	
	<title>基于HeadFirst设计模式之观察者模式 ｜ zansimple</title>
	
    
    
    <meta name="description" content="好，我们接着上一篇继续介绍下一个设计模式 观察者模式 观察者模式定义了对象之间的一对多依赖，这样一来，当一个对象改变状态时，他的所有依赖的对象都会受到通知并自动更新
确定接口 首先写我们的接口 被观察者 和 观察者
//被观察者接口public interface Subject{//注册观察者void RegisterObserver(Observer o);//删除观察者void RemoveObserver(Observer o);//当被观察者状态发生改变时，调用此方法 通知所有的观察者void NotifyObserver();}//观察者接口public interface Observer{void Update();//所有的观察者都必须实现此方法，来实现观察者的接口void Display()；//当观察者需要作出响应的时候调用此方法} 创建被观察者对象 public class WeatherData:Subject{public ArrayList observers //存储所有的观察者，在构造中初始化public WeatherData(){observers=new ArrayList();}public void NotifyObserver()//通知所有观察者发生改变{for (int i = 0; i &amp;lt; observers.Count; i&#43;&#43;){Observer o = (Observer)observers[i];o." />
    

    

	
    
    <link rel="shortcut icon" href="https://lenzan.github.io/images/favicon.ico" />

    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/normalize.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/animate.css@4.1.0/animate.min.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/zozo.css" />
	<link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/highlight.css" />

    
    
</head>

<body>
    <div class="main animate__animated animate__fadeInDown">
        <div class="nav_container animated fadeInDown">
    <div class="site_nav" id="site_nav">
        <ul>
            
            <li>
                <a href="/">首页</a>
            </li>
            
            <li>
                <a href="/">unity</a>
            </li>
            
            <li>
                <a href="/">归档</a>
            </li>
            
            <li>
                <a href="/">关于</a>
            </li>
            
        </ul>
    </div>
    <div class="menu_icon">
        <a id="menu_icon"><i class="ri-menu-line"></i></a>
    </div>
</div>
        <div class="header animated fadeInDown">
    <div class="site_title_container">
        <div class="site_title">
            <h1>
                <a href="https://lenzan.github.io/">
                    <span>zansimple</span>
                    <img src="https://lenzan.github.io/images/logo.svg" />
                </a>
            </h1>
        </div>
        <div class="description">
            <p class="sub_title">专注于Unity虚拟现实开发，游戏开发</p>
            <div class="my_socials">
                
                <a href="https://lenzan.github.io/index.xml" type="application/rss+xml" title="rss" target="_blank"><i
                        class="ri-rss-fill"></i></a>
            </div>
        </div>
    </div>
</div>
        <div class="content">
            <div class="post_page">
                <div class="post animate__animated animate__fadeInDown">
                    <div class="post_title post_detail_title">
                        <h2><a href='/posts/design/HeadFirst-Subject-Observer/'>基于HeadFirst设计模式之观察者模式</a></h2>
                        <span class="date">2018.06.11</span>
                    </div>
                    <div class="post_content markdown"><p>好，我们接着上一篇继续介绍下一个设计模式 观察者模式
观察者模式定义了对象之间的一对多依赖，这样一来，当一个对象改变状态时，他的所有依赖的对象都会受到通知并自动更新</p>
<h2 id="确定接口">确定接口</h2>
<p>首先写我们的接口 被观察者 和 观察者</p>
<pre><code>//被观察者接口
public interface Subject
{
    //注册观察者
    void RegisterObserver(Observer o);
    //删除观察者
    void RemoveObserver(Observer o);
    //当被观察者状态发生改变时，调用此方法 通知所有的观察者
    void NotifyObserver();
}
//观察者接口
public interface Observer
{
    void Update();//所有的观察者都必须实现此方法，来实现观察者的接口
    void Display()；//当观察者需要作出响应的时候调用此方法
}
</code></pre>
<h2 id="创建被观察者对象">创建被观察者对象</h2>
<pre><code>public class WeatherData:Subject
{
    public ArrayList observers //存储所有的观察者，在构造中初始化
	
    public WeatherData()
    {
        observers=new ArrayList();
    }

     public void NotifyObserver()//通知所有观察者发生改变
    {
        for (int i = 0; i &lt; observers.Count; i++)
        {
            Observer o = (Observer)observers[i];
            o.Update();
        }
    }

    public void RegisterObserver(Observer o)//注册观察者
    {
        observers.Add(o);
    }

    public void RemoveObserver(Observer o)//删除观察者
    {
        int index = observers.IndexOf(o);
        if (observers.Count&gt;0)
        {
            observers.Remove(index);
        }
    }
}
</code></pre>
<h2 id="创建观察者对象">创建观察者对象</h2>
<pre><code>//实现 Observer 接口，和 displayelement 接口 

public class ConditionDisplay : Observer
{
    private Subject weatherdata;
    private string weathername;
    public CurrentConditionDisplay(Subject s,string name)//构造器需要subject对象 和观察者的名字
    {
        weatherdata = s;//保存被观察者只是为了以后我们可能会取消注册，会比较方便
        weatherdata.RegisterObserver(this);
        this.weathername = name;
    }
    public void Remove()//取消注册
    {
        waterdata.RemoveObserver(this);
    }
    public void Display()//接到通知后自己做出相应的响应
    {
        Console.WriteLine(watername + &quot;发出相应的改变&quot;);
    }

    public void Update()//接受观察者的通知
    {
        Console.WriteLine(watername+&quot; 已经接到通知&quot;);
        Display();//这个方法目前先在Update方法中调用（详细讲解请看MVC模式）
    }
}
</code></pre>
<h3 id="创建一个测试程序">创建一个测试程序</h3>
<pre><code>public static void Station
{
    public static void Main(string[] arg)
    {
        Subject subject=new weatherdata();
        Observer o1 = new CurrentConditionDisplay(subject,&quot;小明&quot;);
        Observer o2 = new CurrentConditionDisplay(subject,&quot;小红&quot;);
        Observer o3 = new CurrentConditionDisplay(subject,&quot;小李&quot;);
        subject.NotifyObserver();
        o2.Remove();
        Console.WriteLine(&quot;________________________________&quot;);
        subject.NotifyObserver();
		
		
    }
}
</code></pre>
<p>以上就是观察者模式了，上面涉及到 Display() 方法调用的时机，了解 MVC 模式之后会更清楚，后续会更新其他的设计模式，敬请期待&hellip;</p>
</div>
                    <div class="post_footer">
                        
                        <div class="meta">
                            <div class="info">
                                <span class="field tags">
                                    <i class="ri-stack-line"></i>
                                    
                                    <a href="https://lenzan.github.io/tags/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/">观察者模式</a>
                                    
                                    <a href="https://lenzan.github.io/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a>
                                    
                                </span>
                            </div>
                        </div>
                        
                    </div>
                </div>
                
                
            </div>
        </div>
    </div>
    <a id="back_to_top" href="#" class="back_to_top"><span>△</span></a>
    <footer class="footer">
    <div class="powered_by">
        <a href="https://varkai.com">Designed by VarKai,</a>
        <a href="http://www.gohugo.io/">Proudly published with Hugo</a>
    </div>

    <div class="footer_slogan">
        <span></span>
    </div>
</footer>
    <script src="https://lenzan.github.io/js/jquery-3.5.1.min.js"></script>
<link href="https://lenzan.github.io/css/fancybox.min.css" rel="stylesheet">
<script src="https://lenzan.github.io/js/fancybox.min.js"></script>
<script src="https://lenzan.github.io/js/zozo.js"></script>






</body>

</html>